在 DAY23 我們學會了 SIFT,雖然效果非常好,但因為專利授權問題與運算速度較慢,在許多即時應用中並不理想。
今天要介紹的 ORB(Oriented FAST and Rotated BRIEF),它結合了 FAST 與 BRIEF 的優點,提供高效能、免專利限制的特徵檢測與描述方法,非常適合即時電腦視覺應用(例如 SLAM、AR、即時物體追蹤)。
ORB 綜合了 FAST 的快速角點偵測與 BRIEF 的高效描述子,並針對旋轉與尺度進行改良,成為目前主流的即時特徵點方法。
與 DAY23 相同,準備兩張圖片(同一場景但縮放或旋轉不同),例如 box.jpg
與 box_in_scene.jpg
。
import cv2
import numpy as np
# 讀取兩張圖片
img1 = cv2.imread("box.jpg")
img2 = cv2.imread("box_in_scene.jpg")
img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
cv2.imshow("Original img1", img1_gray)
cv2.imshow("Original img2", img2_gray)
# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()
說明:
灰階影像能簡化計算,並保留角點偵測所需的亮度資訊。
在特徵點檢測前,通常會先進行去雜訊(如高斯模糊),以提升檢測品質。
# 建立 ORB 物件
orb = cv2.ORB_create()
# 偵測關鍵點與描述子
kp1, des1 = orb.detectAndCompute(img1_gray, None)
kp2, des2 = orb.detectAndCompute(img2_gray, None)
# 繪製關鍵點
img1_kp = cv2.drawKeypoints(img1_gray, kp1, None, color=(0,255,0), flags=0)
img2_kp = cv2.drawKeypoints(img2_gray, kp2, None, color=(0,255,0), flags=0)
cv2.imshow("ORB Keypoints - img1", img1_kp)
cv2.imshow("ORB Keypoints - img2", img2_kp)
🖼 你會看到圖片上標示出綠色的 ORB 特徵點。
程式說明:
ORB_create()
:建立 ORB 特徵點偵測器。detectAndCompute()
:同時偵測關鍵點與計算二進制描述子。drawKeypoints()
:將偵測到的特徵點標示於影像上。# 建立 BFMatcher(使用漢明距離)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 匹配特徵
matches = bf.match(des1, des2)
# 依照距離排序
matches = sorted(matches, key=lambda x: x.distance)
# 繪製前 20 個最佳匹配
img_matches = cv2.drawMatches(img1_gray, kp1, img2_gray, kp2, matches[:20], None, flags=2)
cv2.imshow("ORB Matching", img_matches)